home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 040 (1987-11-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 040 (1987-11-15)(Ossowski, Stefan)(DE)(PD).adf / SimCPM / simcpm2.asm < prev    next >
Assembly Source File  |  1989-01-18  |  30KB  |  1,379 lines

  1. *************************************************************************
  2. *                                    *
  3. *    This file contains the target processor    (8080)            *
  4. *    simulation routines.                        *
  5. *                                    *
  6. *************************************************************************
  7. * Last revised September 10, 1987.
  8.  
  9.     xdef    optabl,flags,mloop,traceit,tracesad,traceead,traceflg
  10.     xref    illegl,service,dump
  11.  
  12.     ifd    tracehd
  13. trace    equ    1        ;Include trace routines.
  14.     endc
  15.     ifnd    tracehd
  16. trace    equ    0        ;Don't include trace routines.
  17.     endc
  18.  
  19. return     equr    A6        ;JMP (return) is fast return to    MLOOP.
  20. pseudopc equr    A5        ;8080's PC is register A5.
  21. opptr     equr    A4        ;Pointer to opcode dispatch table
  22. pseudosp equr    A3        ;8080's SP is register A3.
  23. flagptr     equr    A2        ;Pointer to 8080's flag lookup table is A2.
  24. targbase equr    A1        ;Pointer to 8080's address space is A1.
  25. regs     equr    A1        ;Base pointer to 8080's registers is A1.
  26. regcon0e equr    D7        ;Register-based    constant #$E (for speed)
  27. regcon01 equr    D6        ;Register-based    constant #$1
  28. regcon0f equr    D5        ;Register-based    constant #$F
  29. regconff equr    D4        ;Register-based    constant #$FF
  30. regf     equr    D3        ;8080's flags
  31. rega     equr    D2        ;8080's accumulator
  32.  
  33. regop3    equ    -9        ;Operand 3 for DAA storage
  34. regb    equ    -8        ;Offsets from register base pointer for
  35. regc    equ    -7        ; 8080's pseudo-registers.
  36. regd    equ    -6        ; A and    F are in 68000's data registers.
  37. rege    equ    -5        ; Pseudo-PC is kept in an address register.
  38. regh    equ    -4        ;
  39. regl    equ    -3        ;
  40. regop1    equ    -2        ;Operand 1 for DAA storage
  41. regop2    equ    -1        ;   "    2  "   "     "
  42.     page
  43. *************************************************************************
  44. *                                    *
  45. *    Macros used by opcode simulation routines            *
  46. *                                    *
  47. *    These generate a lot of    repetitive code    sequences,        *
  48. *    but it's faster than doing subroutine calls.                    *
  49. *                                    *
  50. *************************************************************************
  51.  
  52. setflag    macro            ;Set 8080 flags    from 68000 flags.
  53.     move    sr,d0
  54.     and.w    regcon0f,d0
  55.     move.b    0(flagptr,d0.w),regf
  56.     jmp    (return)
  57.     endm
  58.  
  59. inrflag    macro            ;Set flags after increment or decrement.
  60.     move    sr,d0
  61.     and.w    regcon0e,d0
  62.     and.w    regcon01,regf
  63.     or.b    0(flagptr,d0.w),regf
  64.     jmp    (return)
  65.     endm
  66.  
  67. addflag    macro            ;Add and set flags.
  68.     move.b    d0,regop1(regs)
  69.     move.b    rega,regop2(regs)
  70.     move.b    regcon0e,regop3(regs)
  71.     add.b    d0,rega
  72.     setflag
  73.     endm
  74.  
  75. adcflag    macro            ;Add with carry    and set    flags.
  76.     move.b    d0,regop1(regs)
  77.     move.b    rega,regop2(regs)
  78.     moveq    #0,d1        ;Set Zero flag for ADDX.
  79.     addx.b    d0,rega
  80.     setflag
  81.     endm
  82.  
  83. sbbflag    macro            ;Subtract with borrow and set flags.
  84.     moveq    #0,d1        ;Set Zero flag for SUBX.
  85.     subx.b    d0,rega
  86.     setflag
  87.     endm
  88.  
  89. ret80    macro            ;Return    from subroutine.
  90.     move.b    1(pseudosp),d0
  91.     rol.w    #8,d0
  92.     move.b    (pseudosp),d0
  93.     addq.l    #2,pseudosp
  94.     lea    0(targbase,d0.l),pseudopc
  95.     jmp    (return)
  96.     endm
  97.  
  98. jmpaddr    macro            ;Get address for possible jump or call.
  99.     move.b    1(pseudopc),d0
  100.     rol.w    #8,d0
  101.     move.b    (pseudopc),d0
  102.     addq.l    #2,pseudopc
  103.     endm
  104.  
  105. call80    macro            ;Call a    subroutine
  106.     move.l    pseudopc,d1
  107.     sub.l    targbase,d1
  108.     move.b    d1,-2(pseudosp)
  109.     rol.w    #8,d1
  110.     move.b    d1,-1(pseudosp)
  111.     subq.l    #2,pseudosp
  112.     lea    0(targbase,d0.l),pseudopc
  113.     jmp    (return)
  114.     endm
  115.  
  116. rst80    macro            ;8080 RST instruction
  117.     move.l    pseudopc,d1
  118.     sub.l    targbase,d1
  119.     move.b    d1,-2(pseudosp)
  120.     rol.w    #8,d1
  121.     move.b    d1,-1(pseudosp)
  122.     subq.l    #2,pseudosp
  123.     lea    \1(targbase),pseudopc
  124.     jmp    (return)
  125.     endm
  126.  
  127. docyf    macro            ;Copy 68000's carry flag to 8080
  128.     bcs.s    1$
  129.     bclr    #0,regf
  130.     jmp    (return)
  131. 1$    bset    #0,regf
  132.     jmp    (return)
  133.     endm
  134.     page
  135. *************************************************************************
  136. *                                    *
  137. *    Opcode dispatcher                        *
  138. *                                    *
  139. *************************************************************************
  140.     code
  141. mloop:
  142.     ifne    trace        ;Optional trace
  143.     tst.b    traceflg
  144.     bne.s    dotrace
  145.     cmpa.l    tracesad,pseudopc
  146.     bne.s    notrace
  147.     move.b    #1,traceflg
  148. dotrace    jsr    dump
  149.     cmpa.l    traceead,pseudopc
  150.     bne.s    notrace
  151.     clr.b    traceflg
  152. notrace    equ    *
  153.     endc
  154.  
  155.     moveq    #0,d0        ;Execute appropriate simulation    subroutine.
  156.     move.b    (pseudopc)+,d0    ;Grab the next opcode.
  157.     asl    #2,d0        ;(D0 high word is still    zero!)
  158.     move.l    0(opptr,d0.w),a0
  159.     jmp    (a0)        ;Do the    subroutine.
  160.     page
  161. *************************************************************************
  162. *                                    *
  163. *    Opcode simulation routines                    *
  164. *                                    *
  165. *    Note:  I/O instructions    are based as 68000 address $FF0000    *
  166. *        as is appropriate for the Compupro CPU-68K card.    *
  167. *                                    *
  168. *    Also, all routines assume that the high    word of    D0 is zero!    *
  169. *                                    *
  170. *************************************************************************
  171.  
  172.     even
  173.  
  174. nop00    jmp    (return)        ;00 NOP
  175.  
  176. lxib    move.b    (pseudopc)+,regc(regs)    ;01 LXI    B,nnnn
  177.     move.b    (pseudopc)+,regb(regs)
  178.     jmp    (return)
  179.  
  180. staxb    move.w    regb(regs),d0        ;02 STAX B
  181.     move.b    rega,0(targbase,d0.l)
  182.     jmp    (return)
  183.  
  184. inxb    addq.w    #1,regb(regs)        ;03 INX    B
  185.     jmp    (return)
  186.  
  187. inrb    addq.b    #1,regb(regs)        ;04 INR    B
  188.     inrflag
  189.  
  190. dcrb    subq.b    #1,regb(regs)        ;05 DCR    B
  191.     inrflag
  192.  
  193. mvib    move.b    (pseudopc)+,regb(regs)    ;06 MVI    B,nn
  194.     jmp    (return)
  195.  
  196. rlca    rol.b    #1,rega            ;07 RLC
  197.     docyf
  198.  
  199. nop08    jmp    illegl            ;08 Illegal for    8080
  200.  
  201. dadb    move.w    regb(regs),d0        ;09 DAD    B
  202.     add.w    d0,regh(regs)
  203.     docyf
  204.  
  205. ldaxb    move.w    regb(regs),d0        ;0A LDAX B
  206.     move.b    0(targbase,d0.l),rega
  207.     jmp    (return)
  208.  
  209. dcxb    subq.w    #1,regb(regs)        ;0B DCX    B
  210.     jmp    (return)
  211.  
  212. inrc    addq.b    #1,regc(regs)        ;0C INR    C
  213.     inrflag
  214.  
  215. dcrc    subq.b    #1,regc(regs)        ;0D DCR    C
  216.     inrflag
  217.  
  218. mvic    move.b    (pseudopc)+,regc(regs)    ;0E MVI    C
  219.     jmp    (return)
  220.  
  221. rrca    ror.b    #1,rega            ;0F RRC
  222.     docyf
  223.  
  224. nop10    jmp    illegl            ;10 Illegal for    8080
  225.  
  226. lxid    move.b    (pseudopc)+,rege(regs)    ;11 LXI    D,nnnn
  227.     move.b    (pseudopc)+,regd(regs)
  228.     jmp    (return)
  229.  
  230. staxd    move.w    regd(regs),d0        ;12 STAX D
  231.     move.b    rega,0(targbase,d0.l)
  232.     jmp    (return)
  233.  
  234. inxd    addq.w    #1,regd(regs)        ;13 INX    D
  235.     jmp    (return)
  236.  
  237. inrd    addq.b    #1,regd(regs)        ;14 INR    D
  238.     inrflag
  239.  
  240. dcrd    subq.b    #1,regd(regs)        ;15 DCR    D
  241.     inrflag
  242.  
  243. mvid    move.b    (pseudopc)+,regd(regs)    ;16 MVI    D,nn
  244.     jmp    (return)
  245.  
  246. ral    roxr.b    #1,regf            ;17 RAL
  247.     roxl.b    #1,rega
  248.     roxl.b    #1,regf
  249.     jmp    (return)
  250.  
  251. nop18    jmp    illegl            ;18 Illegal for    8080
  252.  
  253. dadd    move.w    regd(regs),d0        ;19 DAD    D
  254.     add.w    d0,regh(regs)
  255.     docyf
  256.  
  257. ldaxd    move.w    regd(regs),d0        ;1A LDAX D
  258.     move.b    0(targbase,d0.l),rega
  259.     jmp    (return)
  260.  
  261. dcxd    subq.w    #1,regd(regs)        ;1B DCX    D
  262.     jmp    (return)
  263.  
  264. inre    addq.b    #1,rege(regs)        ;1C INR    E
  265.     inrflag
  266.  
  267. dcre    subq.b    #1,rege(regs)        ;1D DCR    E
  268.     inrflag
  269.  
  270. mvie    move.b    (pseudopc)+,rege(regs)    ;1E MVI    E
  271.     jmp    (return)
  272.  
  273. rar    roxr.b    #1,regf            ;1F RAR
  274.     roxr.b    #1,rega
  275.     roxl.b    #1,regf
  276.     jmp    (return)
  277.  
  278. nop20    jmp    illegl            ;20 Illegal for    8080
  279.  
  280. lxih    move.b    (pseudopc)+,regl(regs)    ;21 LXI    H,nnnn
  281.     move.b    (pseudopc)+,regh(regs)
  282.     jmp    (return)
  283.  
  284. shld    move.b    1(pseudopc),d0        ;22 SHLD addr
  285.     rol.w    #8,d0
  286.     move.b    (pseudopc),d0
  287.     addq.l    #2,pseudopc
  288.     move.l    d0,a0
  289.     adda.l    targbase,a0
  290.     move.b    regl(regs),(a0)+
  291.     move.b    regh(regs),(a0)+
  292.     jmp    (return)
  293.  
  294. inxh    addq.w    #1,regh(regs)        ;23 INX    H
  295.     jmp    (return)
  296.  
  297. inrh    addq.b    #1,regh(regs)        ;24 INR    H
  298.     inrflag
  299.  
  300. dcrh    subq.b    #1,regh(regs)        ;25 DCR    H
  301.     inrflag
  302.  
  303. mvih    move.b    (pseudopc)+,regh(regs)    ;26 MVI    H,nn
  304.     jmp    (return)
  305.  
  306. daa    move.b    regop3(regs),d0        ;27 DAA
  307.     roxr.b    #1,d0
  308.     move.b    regop2(regs),d0
  309.     move.b    regop1(regs),d1
  310.     swap    regcon0e
  311.     move.b    rega,regcon0e
  312.     and.b    regcon0f,regcon0e
  313.     cmp.b    #9,regcon0e
  314.     bhi.s    halfcy
  315.     and.b    regcon0f,d0
  316.     and.b    regcon0f,d1
  317.     ori.b    #$F0,d1
  318.     addx.b    d0,d1
  319.     bcc.s    nohalf
  320. halfcy    add.b    #6,rega
  321.     bcs.s    fullcy
  322. nohalf    btst    #0,regf
  323.     bne.s    fullcy
  324.     move.b    rega,regcon0e
  325.     and.b    #$F0,regcon0e
  326.     cmp.b    #$90,regcon0e
  327.     bls.s    nofull
  328. fullcy    add.b    #$60,rega
  329.     ori    #1,ccr
  330. enddaa    move    sr,regf
  331.     swap    regcon0e
  332.     and.w    regcon0f,regf
  333.     move.b    0(flagptr,regf.w),regf
  334.     jmp    (return)
  335. nofull    tst.b    rega
  336.     bra.s    enddaa
  337.  
  338. nop28    jmp    illegl            ;28 Illegal for    8080
  339.  
  340. dadh    asl.w    regh(regs)        ;29 DAD H (multiply by 2)
  341.     docyf
  342.  
  343. lhld    move.b    1(pseudopc),d0        ;2A LHLD addr
  344.     rol.w    #8,d0
  345.     move.b    (pseudopc),d0
  346.     addq.l    #2,pseudopc
  347.     move.l    d0,a0
  348.     adda.l    targbase,a0
  349.     move.b    (a0)+,regl(regs)
  350.     move.b    (a0),regh(regs)
  351.     jmp    (return)
  352.  
  353. dcxh    subq.w    #1,regh(regs)        ;2B DCX    H
  354.     jmp    (return)
  355.  
  356. inrl    addq.b    #1,regl(regs)        ;2C INR    L
  357.     inrflag
  358.  
  359. dcrl    subq.b    #1,regl(regs)        ;2D DCR    L
  360.     inrflag
  361.  
  362. mvil    move.b    (pseudopc)+,regl(regs)    ;2E MVI    L,nn
  363.     jmp    (return)
  364.  
  365. cma    not.b    rega            ;2F CMA
  366.     jmp    (return)
  367.  
  368. nop30    jmp    illegl            ;30 Illegal for    8080
  369.  
  370. lxis    move.b    1(pseudopc),d0        ;31 LXI    SP,nnnn
  371.     rol.w    #8,d0
  372.     move.b    (pseudopc),d0
  373.     addq.l    #2,pseudopc
  374.     move.l    d0,pseudosp
  375.     adda.l    targbase,pseudosp
  376.     jmp    (return)
  377.  
  378. sta    move.b    1(pseudopc),d0        ;32 STA    addr
  379.     rol.w    #8,d0
  380.     move.b    (pseudopc),d0
  381.     addq.l    #2,pseudopc
  382.     move.b    rega,0(targbase,d0.l)
  383.     jmp    (return)
  384.  
  385. inxs    addq.l    #1,pseudosp        ;33 INX    SP
  386.     jmp    (return)
  387.  
  388. inrm    move.w    regh(regs),d0        ;34 INR    M
  389.     addq.b    #1,0(targbase,d0.l)
  390.     inrflag
  391.  
  392. dcrm    move.w    regh(regs),d0        ;35 DCR    M
  393.     subq.b    #1,0(targbase,d0.l)
  394.     inrflag
  395.  
  396. mvim    move.w    regh(regs),d0        ;36 MVI    M,nn
  397.     move.b    (pseudopc)+,0(targbase,d0.l)
  398.     jmp    (return)
  399.  
  400. stc    bset    #0,regf            ;37 STC
  401.     jmp    (return)
  402.  
  403. nop38    jmp    illegl            ;38 Illegal for    8080
  404.  
  405. dads    move.l    pseudosp,d0        ;39 DAD    SP
  406.     sub.l    targbase,d0
  407.     add.w    d0,regh(regs)
  408.     docyf
  409.  
  410. lda    move.b    1(pseudopc),d0        ;3A LDA    addr
  411.     rol.w    #8,d0
  412.     move.b    (pseudopc),d0
  413.     addq.l    #2,pseudopc
  414.     move.b    0(targbase,d0.l),rega
  415.     jmp    (return)
  416.  
  417. dcxs    subq.l    #1,pseudosp        ;3B DCX    SP
  418.     jmp    (return)
  419.  
  420. inra    move.b    rega,regop1(regs)    ;3C INR    A
  421.     move.b    regcon01,regop2(regs)
  422.     move.b    regcon0e,regop3(regs)
  423.     addq.b    #1,rega
  424.     inrflag
  425.  
  426. dcra    subq.b    #1,rega            ;3D DCR    A
  427.     inrflag
  428.  
  429. mvia    move.b    (pseudopc)+,rega    ;3E MVI    A
  430.     jmp    (return)
  431.  
  432. cmc    bchg    #0,regf            ;3F CMC
  433.     jmp    (return)
  434.  
  435. movebb    move.b    regb(regs),regb(regs)    ;40 MOV    B,B
  436.     jmp    (return)
  437.  
  438. movebc    move.b    regc(regs),regb(regs)    ;41 MOV    B,C
  439.     jmp    (return)
  440.  
  441. movebd    move.b    regd(regs),regb(regs)    ;42 MOV    B,D
  442.     jmp    (return)
  443.  
  444. movebe    move.b    rege(regs),regb(regs)    ;43 MOV    B,E
  445.     jmp    (return)
  446.  
  447. movebh    move.b    regh(regs),regb(regs)    ;44 MOV    B,H
  448.     jmp    (return)
  449.  
  450. movebl    move.b    regl(regs),regb(regs)    ;45 MOV    B,L
  451.     jmp    (return)
  452.  
  453. movebm    move.w    regh(regs),d0        ;46 MOV    B,M
  454.     move.b    0(targbase,d0.l),regb(regs)
  455.     jmp    (return)
  456.  
  457. moveba    move.b    rega,regb(regs)        ;47 MOV    B,A
  458.     jmp    (return)
  459.  
  460. movecb    move.b    regb(regs),regc(regs)    ;48 MOV    C,B
  461.     jmp    (return)
  462.  
  463. movecc    move.b    regc(regs),regc(regs)    ;49 MOV    C,C
  464.     jmp    (return)
  465.  
  466. movecd    move.b    regd(regs),regc(regs)    ;4A MOV    C,D
  467.     jmp    (return)
  468.  
  469. movece    move.b    rege(regs),regc(regs)    ;4B MOV    C,E
  470.     jmp    (return)
  471.  
  472. movech    move.b    regh(regs),regc(regs)    ;4C MOV    C,H
  473.     jmp    (return)
  474.  
  475. movecl    move.b    regl(regs),regc(regs)    ;4D MOV    C,L
  476.     jmp    (return)
  477.  
  478. movecm    move.w    regh(regs),d0        ;4E MOV    C,M
  479.     move.b    0(targbase,d0.l),regc(regs)
  480.     jmp    (return)
  481.  
  482. moveca    move.b    rega,regc(regs)        ;4F MOV    C,A
  483.     jmp    (return)
  484.  
  485. movedb    move.b    regb(regs),regd(regs)    ;50 MOV    D,B
  486.     jmp    (return)
  487.  
  488. movedc    move.b    regc(regs),regd(regs)    ;51 MOV    D,C
  489.     jmp    (return)
  490.  
  491. movedd    move.b    regd(regs),regd(regs)    ;52 MOV    D,D
  492.     jmp    (return)
  493.  
  494. movede    move.b    rege(regs),regd(regs)    ;53 MOV    D,E
  495.     jmp    (return)
  496.  
  497. movedh    move.b    regh(regs),regd(regs)    ;54 MOV    D,H
  498.     jmp    (return)
  499.  
  500. movedl    move.b    regl(regs),regd(regs)    ;55 MOV    D,L
  501.     jmp    (return)
  502.  
  503. movedm    move.w    regh(regs),d0        ;56 MOV    D,M
  504.     move.b    0(targbase,d0.l),regd(regs)
  505.     jmp    (return)
  506.  
  507. moveda    move.b    rega,regd(regs)        ;57 MOV    D,A
  508.     jmp    (return)
  509.  
  510. moveeb    move.b    regb(regs),rege(regs)    ;58 MOV    E,B
  511.     jmp    (return)
  512.  
  513. moveec    move.b    regc(regs),rege(regs)    ;59 MOV    E,C
  514.     jmp    (return)
  515.  
  516. moveed    move.b    regd(regs),rege(regs)    ;5A MOV    E,D
  517.     jmp    (return)
  518.  
  519. moveee    move.b    rege(regs),rege(regs)    ;5B MOV    E,E
  520.     jmp    (return)
  521.  
  522. moveeh    move.b    regh(regs),rege(regs)    ;5C MOV    E,H
  523.     jmp    (return)
  524.  
  525. moveel    move.b    regl(regs),rege(regs)    ;5D MOV    E,L
  526.     jmp    (return)
  527.  
  528. moveem    move.w    regh(regs),d0        ;5E MOV    E,M
  529.     move.b    0(targbase,d0.l),rege(regs)
  530.     jmp    (return)
  531.  
  532. moveea    move.b    rega,rege(regs)        ;5F MOV    E,A
  533.     jmp    (return)
  534.  
  535. movehb    move.b    regb(regs),regh(regs)    ;60 MOV    H,B
  536.     jmp    (return)
  537.  
  538. movehc    move.b    regc(regs),regh(regs)    ;61 MOV    H,C
  539.     jmp    (return)
  540.  
  541. movehd    move.b    regd(regs),regh(regs)    ;62 MOV    H,D
  542.     jmp    (return)
  543.  
  544. movehe    move.b    rege(regs),regh(regs)    ;63 MOV    H,E
  545.     jmp    (return)
  546.  
  547. movehh    move.b    regh(regs),regh(regs)    ;64 MOV    H,H
  548.     jmp    (return)
  549.  
  550. movehl    move.b    regl(regs),regh(regs)    ;65 MOV    H,L
  551.     jmp    (return)
  552.  
  553. movehm    move.w    regh(regs),d0        ;66 MOV    H,M
  554.     move.b    0(targbase,d0.l),regh(regs)
  555.     jmp    (return)
  556.  
  557. moveha    move.b    rega,regh(regs)        ;67 MOV    H,A
  558.     jmp    (return)
  559.  
  560. movelb    move.b    regb(regs),regl(regs)    ;68 MOV    L,B
  561.     jmp    (return)
  562.  
  563. movelc    move.b    regc(regs),regl(regs)    ;69 MOV    L,C
  564.     jmp    (return)
  565.  
  566. moveld    move.b    regd(regs),regl(regs)    ;6A MOV    L,D
  567.     jmp    (return)
  568.  
  569. movele    move.b    rege(regs),regl(regs)    ;6B MOV    L,E
  570.     jmp    (return)
  571.  
  572. movelh    move.b    regh(regs),regl(regs)    ;6C MOV    L,H
  573.     jmp    (return)
  574.  
  575. movell    move.b    regl(regs),regl(regs)    ;6D MOV    L,L
  576.     jmp    (return)
  577.  
  578. movelm    move.w    regh(regs),d0        ;6E MOV    L,M
  579.     move.b    0(targbase,d0.l),regl(regs)
  580.     jmp    (return)
  581.  
  582. movela    move.b    rega,regl(regs)        ;6F MOV    L,A
  583.     jmp    (return)
  584.  
  585. movemb    move.w    regh(regs),d0        ;70 MOV    M,B
  586.     move.b    regb(regs),0(targbase,d0.l)
  587.     jmp    (return)
  588.  
  589. movemc    move.w    regh(regs),d0        ;71 MOV    M,C
  590.     move.b    regc(regs),0(targbase,d0.l)
  591.     jmp    (return)
  592.  
  593. movemd    move.w    regh(regs),d0        ;72 MOV    M,D
  594.     move.b    regd(regs),0(targbase,d0.l)
  595.     jmp    (return)
  596.  
  597. moveme    move.w    regh(regs),d0        ;73 MOV    M,E
  598.     move.b    rege(regs),0(targbase,d0.l)
  599.     jmp    (return)
  600.  
  601. movemh    move.w    regh(regs),d0        ;74 MOV    M,H
  602.     move.b    regh(regs),0(targbase,d0.l)
  603.     jmp    (return)
  604.  
  605. moveml    move.w    regh(regs),d0        ;75 MOV    M,L
  606.     move.b    regl(regs),0(targbase,d0.l)
  607.     jmp    (return)
  608.  
  609. halt    jsr    service            ;76 HLT
  610.     jmp    (return)
  611.  
  612. movema    move.w    regh(regs),d0        ;77 MOV    M,A
  613.     move.b    rega,0(targbase,d0.l)
  614.     jmp    (return)
  615.  
  616. moveab    move.b    regb(regs),rega        ;78 MOV    A,B
  617.     jmp    (return)
  618.  
  619. moveac    move.b    regc(regs),rega        ;79 MOV    A,C
  620.     jmp    (return)
  621.  
  622. movead    move.b    regd(regs),rega        ;7A MOV    A,D
  623.     jmp    (return)
  624.  
  625. moveae    move.b    rege(regs),rega        ;7B MOV    A,E
  626.     jmp    (return)
  627.  
  628. moveah    move.b    regh(regs),rega        ;7C MOV    A,H
  629.     jmp    (return)
  630.  
  631. moveal    move.b    regl(regs),rega        ;7D MOV    A,L
  632.     jmp    (return)
  633.  
  634. moveam    move.w    regh(regs),d0        ;7E MOV    A,M
  635.     move.b    0(targbase,d0.l),rega
  636.     jmp    (return)
  637.  
  638. moveaa    jmp    (return)        ;7F MOV    A,A
  639.  
  640. addb    move.b    regb(regs),d0        ;80 ADD    B
  641.     addflag
  642.  
  643. addc    move.b    regc(regs),d0        ;81 ADD    C
  644.     addflag
  645.  
  646. addd    move.b    regd(regs),d0        ;82 ADD    D
  647.     addflag
  648.  
  649. adde    move.b    rege(regs),d0        ;83 ADD    E
  650.     addflag
  651.  
  652. addh    move.b    regh(regs),d0        ;84 ADD    H
  653.     addflag
  654.  
  655. addl    move.b    regl(regs),d0        ;85 ADD    L
  656.     addflag
  657.  
  658. addm    move.w    regh(regs),d0        ;86 ADD    M
  659.     move.b    0(targbase,d0.l),d0
  660.     addflag
  661.  
  662. adda    move.b    rega,regop1(regs)    ;87 ADD    A
  663.     move.b    rega,regop2(regs)
  664.     move.b    regcon0e,regop3(regs)
  665.     add.b    rega,rega
  666.     setflag
  667.  
  668. adcb    move.b    regf,regop3(regs)    ;88 ADC    B
  669.     asr.b    #1,regf
  670.     move.b    regb(regs),d0
  671.     adcflag
  672.  
  673. adcc    move.b    regf,regop3(regs)    ;89 ADC    C
  674.     asr.b    #1,regf
  675.     move.b    regc(regs),d0
  676.     adcflag
  677.  
  678. adcd    move.b    regf,regop3(regs)    ;8A ADC    D
  679.     asr.b    #1,regf
  680.     move.b    regd(regs),d0
  681.     adcflag
  682.  
  683. adce    move.b    regf,regop3(regs)    ;8B ADC    E
  684.     asr.b    #1,regf
  685.     move.b    rege(regs),d0
  686.     adcflag
  687.  
  688. adch    move.b    regf,regop3(regs)    ;8C ADC    H
  689.     asr.b    #1,regf
  690.     move.b    regh(regs),d0
  691.     adcflag
  692.  
  693. adcl    move.b    regf,regop3(regs)    ;8D ADC    L
  694.     asr.b    #1,regf
  695.     move.b    regl(regs),d0
  696.     adcflag
  697.  
  698. adcm    move.b    regf,regop3(regs)    ;8E ADC    M
  699.     move.w    regh(regs),d0
  700.     move.l    d0,a0
  701.     adda.l    targbase,a0
  702.     asr.b    #1,regf
  703.     move.b    (a0),d0
  704.     adcflag
  705.  
  706. adca    move.b    regf,regop3(regs)    ;8F ADC    A
  707.     asr.b    #1,regf
  708.     move.b    rega,d0
  709.     adcflag
  710.  
  711. subb    sub.b    regb(regs),rega        ;90 SUB    B
  712.     setflag
  713.  
  714. subc    sub.b    regc(regs),rega        ;91 SUB    C
  715.     setflag
  716.  
  717. subd    sub.b    regd(regs),rega        ;92 SUB    D
  718.     setflag
  719.  
  720. sube    sub.b    rege(regs),rega        ;93 SUB    E
  721.     setflag
  722.  
  723. subh    sub.b    regh(regs),rega        ;94 SUB    H
  724.     setflag
  725.  
  726. subl    sub.b    regl(regs),rega        ;95 SUB    L
  727.     setflag
  728.  
  729. subm    move.w    regh(regs),d0        ;96 SUB    M
  730.     sub.b    0(targbase,d0.l),rega
  731.     setflag
  732.  
  733. suba    sub.b    rega,rega        ;97 SUB    A
  734.     setflag
  735.  
  736. sbbb    asr.b    #1,regf            ;98 SBB    B
  737.     move.b    regb(regs),d0
  738.     sbbflag
  739.  
  740. sbbc    asr.b    #1,regf            ;99 SBB    C
  741.     move.b    regc(regs),d0
  742.     sbbflag
  743.  
  744. sbbd    asr.b    #1,regf            ;9A SBB    D
  745.     move.b    regd(regs),d0
  746.     sbbflag
  747.  
  748. sbbe    asr.b    #1,regf            ;9B SBB    E
  749.     move.b    rege(regs),d0
  750.     sbbflag
  751.  
  752. sbbh    asr.b    #1,regf            ;9C SBB    H
  753.     move.b    regh(regs),d0
  754.     sbbflag
  755.  
  756. sbbl    asr.b    #1,regf            ;9D SBB    L
  757.     move.b    regl(regs),d0
  758.     sbbflag
  759.  
  760. sbbm    move.w    regh(regs),d0        ;9E SBB    M
  761.     move.l    d0,a0
  762.     adda.l    targbase,a0
  763.     asr.b    #1,regf
  764.     move.b    (a0),d0
  765.     sbbflag
  766.  
  767. sbba    asr.b    #1,regf            ;9F SBB    A
  768.     move.b    rega,d0
  769.     sbbflag
  770.  
  771. andb    and.b    regb(regs),rega        ;A0 ANA    B
  772.     move.b    16(flagptr,rega.w),regf
  773.     jmp    (return)
  774.  
  775. andc    and.b    regc(regs),rega        ;A1 ANA    C
  776.     move.b    16(flagptr,rega.w),regf
  777.     jmp    (return)
  778.  
  779. andd    and.b    regd(regs),rega        ;A2 ANA    D
  780.     move.b    16(flagptr,rega.w),regf
  781.     jmp    (return)
  782.  
  783. ande    and.b    rege(regs),rega        ;A3 ANA    E
  784.     move.b    16(flagptr,rega.w),regf
  785.     jmp    (return)
  786.  
  787. andh    and.b    regh(regs),rega        ;A4 ANA    H
  788.     move.b    16(flagptr,rega.w),regf
  789.     jmp    (return)
  790.  
  791. andl    and.b    regl(regs),rega        ;A5 ANA    L
  792.     move.b    16(flagptr,rega.w),regf
  793.     jmp    (return)
  794.  
  795. andm    move.w    regh(regs),d0        ;A6 ANA    M
  796.     and.b    0(targbase,d0.l),rega
  797.     move.b    16(flagptr,rega.w),regf
  798.     jmp    (return)
  799.  
  800. anda    move.b    16(flagptr,rega.w),regf    ;A7 ANA A
  801.     jmp    (return)
  802.  
  803. xrab    move.b    regb(regs),d0        ;A8 XRA    B
  804.     eor.b    d0,rega
  805.     move.b    16(flagptr,rega.w),regf
  806.     jmp    (return)
  807.  
  808. xrac    move.b    regc(regs),d0        ;A9 XRA    C
  809.     eor.b    d0,rega
  810.     move.b    16(flagptr,rega.w),regf
  811.     jmp    (return)
  812.  
  813. xrad    move.b    regd(regs),d0        ;AA XRA    D
  814.     eor.b    d0,rega
  815.     move.b    16(flagptr,rega.w),regf
  816.     jmp    (return)
  817.  
  818. xrae    move.b    rege(regs),d0        ;AB XRA    E
  819.     eor.b    d0,rega
  820.     move.b    16(flagptr,rega.w),regf
  821.     jmp    (return)
  822.  
  823. xrah    move.b    regh(regs),d0        ;AC XRA    H
  824.     eor.b    d0,rega
  825.     move.b    16(flagptr,rega.w),regf
  826.     jmp    (return)
  827.  
  828. xral    move.b    regl(regs),d0        ;AD XRA    L
  829.     eor.b    d0,rega
  830.     move.b    16(flagptr,rega.w),regf
  831.     jmp    (return)
  832.  
  833. xram    move.w    regh(regs),d0        ;AE XRA    M
  834.     move.b    0(targbase,d0.l),d0
  835.     eor.b    d0,rega
  836.     move.b    16(flagptr,rega.w),regf
  837.     jmp    (return)
  838.  
  839. xraa    moveq    #0,rega            ;AF XRA    A (clears accumulator)
  840.     move.b    16(flagptr),regf
  841.     jmp    (return)
  842.  
  843. orab    or.b    regb(regs),rega        ;B0 ORA    B
  844.     move.b    16(flagptr,rega.w),regf
  845.     jmp    (return)
  846.  
  847. orac    or.b    regc(regs),rega        ;B1 ORA    C
  848.     move.b    16(flagptr,rega.w),regf
  849.     jmp    (return)
  850.  
  851. orad    or.b    regd(regs),rega        ;B2 ORA    D
  852.     move.b    16(flagptr,rega.w),regf
  853.     jmp    (return)
  854.  
  855. orae    or.b    rege(regs),rega        ;B3 ORA    E
  856.     move.b    16(flagptr,rega.w),regf
  857.     jmp    (return)
  858.  
  859. orah    or.b    regh(regs),rega        ;B4 ORA    H
  860.     move.b    16(flagptr,rega.w),regf
  861.     jmp    (return)
  862.  
  863. oral    or.b    regl(regs),rega        ;B5 ORA    L
  864.     move.b    16(flagptr,rega.w),regf
  865.     jmp    (return)
  866.  
  867. oram    move.w    regh(regs),d0        ;B6 ORA    M
  868.     or.b    0(targbase,d0.l),rega
  869.     move.b    16(flagptr,rega.w),regf
  870.     jmp    (return)
  871.  
  872. oraa    move.b    16(flagptr,rega.w),regf    ;B7 ORA A
  873.     jmp    (return)
  874.  
  875. cmpb    cmp.b    regb(regs),rega        ;B8 CMP    B
  876.     setflag
  877.  
  878. cmpc    cmp.b    regc(regs),rega        ;B9 CMP    C
  879.     setflag
  880.  
  881. cmpd    cmp.b    regd(regs),rega        ;BA CMP    D
  882.     setflag
  883.  
  884. cmpe    cmp.b    rege(regs),rega        ;BB CMP    E
  885.     setflag
  886.  
  887. cmph    cmp.b    regh(regs),rega        ;BC CMP    H
  888.     setflag
  889.  
  890. cmpl    cmp.b    regl(regs),rega        ;BD CMP    L
  891.     setflag
  892.  
  893. cmpam    move.w    regh(regs),d0        ;BE CMP    M
  894.     cmp.b    0(targbase,d0.l),rega
  895.     setflag
  896.  
  897. cmpaa    cmp.b    rega,rega        ;BF CMP    A
  898.     setflag
  899.  
  900. rnz    btst    #6,regf            ;C0 RNZ
  901.     bne    mloop
  902.     ret80
  903.  
  904. popb    move.b    (pseudosp)+,regc(regs)    ;C1 POP    B
  905.     move.b    (pseudosp)+,regb(regs)
  906.     jmp    (return)
  907.  
  908. jnz:                    ;C2 JNZ    addr
  909.     jmpaddr
  910.     btst    #6,regf
  911.     bne    mloop
  912.     lea    0(targbase,d0.l),pseudopc
  913.     jmp    (return)
  914.  
  915. jmpa:                    ;C3 JMP    addr
  916.     jmpaddr
  917.     lea    0(targbase,d0.l),pseudopc
  918.     jmp    (return)
  919.  
  920. cnz:                    ;C4 CNZ    addr
  921.     jmpaddr
  922.     btst    #6,regf
  923.     bne    mloop
  924.     call80
  925.  
  926. pushb    move.b    regb(regs),-(pseudosp)    ;C5 PUSH B
  927.     move.b    regc(regs),-(pseudosp)
  928.     jmp    (return)
  929.  
  930. adi    move.b    (pseudopc)+,d0        ;C6 ADI    nn
  931.     addflag
  932.  
  933. rst0:                    ;C7 RST    0
  934.     rst80    $0
  935.  
  936. rz    btst    #6,regf            ;C8 RZ
  937.     beq    mloop
  938. ret:                    ;C9 RET
  939.     ret80
  940.  
  941. jz:                    ;CA JZ addr
  942.     jmpaddr
  943.     btst    #6,regf
  944.     beq    mloop
  945.     lea    0(targbase,d0.l),pseudopc
  946.     jmp    (return)
  947.  
  948. nopCB    jmp    illegl            ;CB Illegal for    8080
  949.  
  950. cz:                    ;CC CZ addr
  951.     jmpaddr
  952.     btst    #6,regf
  953.     beq    mloop
  954.     call80
  955.  
  956. call:                    ;CD CALL addr
  957.     jmpaddr
  958.     call80
  959.  
  960. aci:    move.b    regf,regop3(regs)    ;CE ACI    nn
  961.     asr.b    #1,regf
  962.     move.b    (pseudopc)+,d0
  963.     adcflag
  964.  
  965. rst1:                    ;CF RST    1
  966.     rst80    $8
  967.  
  968. rnc    btst    #0,regf            ;D0 RNC
  969.     bne    mloop
  970.     ret80
  971.  
  972. popd    move.b    (pseudosp)+,rege(regs)    ;D1 POP    D
  973.     move.b    (pseudosp)+,regd(regs)
  974.     jmp    (return)
  975.  
  976. jnc:                    ;D2 JNC    addr
  977.     jmpaddr
  978.     btst    #0,regf
  979.     bne    mloop
  980.     lea    0(targbase,d0.l),pseudopc
  981.     jmp    (return)
  982.  
  983. out    moveq    #0,d0            ;D3 OUT    nn
  984. *    move.b    (pseudopc)+,d0
  985. *    move.l    #$ff0000,a0
  986. *    move.b    rega,0(a0,d0.l)
  987.     jmp    (return)
  988.  
  989. cnc                    ;D4 CNC    addr
  990.     jmpaddr
  991.     btst    #0,regf
  992.     bne    mloop
  993.     call80
  994.  
  995. pushd    move.b    regd(regs),-(pseudosp)    ;D5 PUSH D
  996.     move.b    rege(regs),-(pseudosp)
  997.     jmp    (return)
  998.  
  999. sui    move.b    (pseudopc)+,d0        ;D6 SUI    nn
  1000.     sub.b    d0,rega
  1001.     setflag
  1002.  
  1003. rst2:                    ;D7 RST    2
  1004.     rst80    $10
  1005.  
  1006. rc    btst    #0,regf            ;D8 RC
  1007.     beq    mloop
  1008.     ret80
  1009.  
  1010. nopD9    jmp    illegl            ;D9 Illegal for    8080
  1011.  
  1012. jc:                    ;DA JC addr
  1013.     jmpaddr
  1014.     btst    #0,regf
  1015.     beq    mloop
  1016.     lea    0(targbase,d0.l),pseudopc
  1017.     jmp    (return)
  1018.  
  1019. in    moveq    #0,d0            ;DB IN nn
  1020. *    move.b    (pseudopc)+,d0
  1021. *    move.l    #$FF0000,a0
  1022. *    move.b    0(a0,d0.l),rega
  1023.     jmp    (return)
  1024.  
  1025. cc:                    ;DC CC addr
  1026.     jmpaddr
  1027.     btst    #0,regf
  1028.     beq    mloop
  1029.     call80
  1030.  
  1031. nopDD    jmp    illegl            ;DD Illegal for    8080
  1032.  
  1033. sbi    asr.b    #1,regf            ;DE SBI    nn
  1034.     move.b    (pseudopc)+,d0
  1035.     sbbflag
  1036.  
  1037. rst3:                    ;DF RST    3
  1038.     rst80    $18
  1039.  
  1040. rpo    btst    #2,regf            ;E0 RPO
  1041.     bne    mloop
  1042.     ret80
  1043.  
  1044. poph    move.b    (pseudosp)+,regl(regs)    ;E1 POP    H
  1045.     move.b    (pseudosp)+,regh(regs)
  1046.     jmp    (return)
  1047.  
  1048. jpo:                    ;E2 JPO    addr
  1049.     jmpaddr
  1050.     btst    #2,regf
  1051.     bne    mloop
  1052.     lea    0(targbase,d0.l),pseudopc
  1053.     jmp    (return)
  1054.  
  1055. xthl    move.b    regl(regs),d0        ;E3 XTHL
  1056.     move.b    (pseudosp),regl(regs)
  1057.     move.b    d0,(pseudosp)
  1058.     move.b    regh(regs),d0
  1059.     move.b    1(pseudosp),regh(regs)
  1060.     move.b    d0,1(pseudosp)
  1061.     jmp    (return)
  1062.  
  1063. cpo:                    ;E4 CPO    addr
  1064.     jmpaddr
  1065.     btst    #2,regf
  1066.     bne    mloop
  1067.     call80
  1068.  
  1069. pushh    move.b    regh(regs),-(pseudosp)    ;E5 PUSH H
  1070.     move.b    regl(regs),-(pseudosp)
  1071.     jmp    (return)
  1072.  
  1073. ani    and.b    (pseudopc)+,rega    ;E6 ANI    nn
  1074.     move.b    16(flagptr,rega.w),regf
  1075.     jmp    (return)
  1076.  
  1077. rst4:                    ;E7 RST    4
  1078.     rst80    $20
  1079.  
  1080. rpe    btst    #2,regf            ;E8 RPE
  1081.     beq    mloop
  1082.     ret80
  1083.  
  1084. pchl    move.w    regh(regs),d0        ;E9 PCHL
  1085.     lea    0(targbase,d0.l),pseudopc
  1086.     jmp    (return)
  1087.  
  1088. jpe:                    ;EA JPE    addr
  1089.     jmpaddr
  1090.     btst    #2,regf
  1091.     beq    mloop
  1092.     lea    0(targbase,d0.l),pseudopc
  1093.     jmp    (return)
  1094.  
  1095. xchg    move.w    regd(regs),d0        ;EB XCHG
  1096.     move.w    regh(regs),regd(regs)
  1097.     move.w    d0,regh(regs)
  1098.     jmp    (return)
  1099.  
  1100. cpe:                    ;EC CPE    addr
  1101.     jmpaddr
  1102.     btst    #2,regf
  1103.     beq    mloop
  1104.     call80
  1105.  
  1106. * ED-prefix Z80    instructions are simulated in the next module.
  1107.  
  1108. xri    move.b    (pseudopc)+,d0        ;EE XRI    nn
  1109.     eor.b    d0,rega
  1110.     move.b    16(flagptr,rega.w),regf
  1111.     jmp    (return)
  1112.  
  1113. rst5:                    ;EF RST    5
  1114.     rst80    $28
  1115.  
  1116. rp    btst    #7,regf            ;F0 RP
  1117.     bne    mloop
  1118.     ret80
  1119.  
  1120. popp    move.b    (pseudosp)+,regf    ;F1 POP    P
  1121.     move.b    (pseudosp)+,rega
  1122.     jmp    (return)
  1123.  
  1124. jp:                    ;F2 JP addr
  1125.     jmpaddr
  1126.     btst    #7,regf
  1127.     bne    mloop
  1128.     lea    0(targbase,d0.l),pseudopc
  1129.     jmp    (return)
  1130.  
  1131. di    jmp    (return)        ;F3 DI (treated    as no-op)
  1132.  
  1133. cp:                    ;F4 CP addr
  1134.     jmpaddr
  1135.     btst    #7,regf
  1136.     bne    mloop
  1137.     call80
  1138.  
  1139. pushp    move.b    rega,-(pseudosp)    ;F5 PUSH PSW
  1140.     move.b    regf,-(pseudosp)
  1141.     jmp    (return)
  1142.  
  1143. oria    or.b    (pseudopc)+,rega    ;F6 ORI    nn
  1144.     move.b    16(flagptr,rega.w),regf
  1145.     jmp    (return)
  1146.  
  1147. rst6:                    ;F7 RST    6
  1148.     rst80    $30
  1149.  
  1150. rm    btst    #7,regf            ;F8 RM
  1151.     beq    mloop
  1152.     ret80
  1153.  
  1154. sphl    move.w    regh(regs),d0        ;F9 SPHL
  1155.     lea    0(targbase,d0.l),pseudosp
  1156.     jmp    (return)
  1157.  
  1158. jm:                    ;FA JM addr
  1159.     jmpaddr
  1160.     btst    #7,regf
  1161.     beq    mloop
  1162.     lea    0(targbase,d0.l),pseudopc
  1163.     jmp    (return)
  1164.  
  1165. ei    jmp    (return)        ;FB EI (treated    as a no-op)
  1166.  
  1167. cm:                    ;FC CM addr
  1168.     jmpaddr
  1169.     btst    #7,regf
  1170.     beq    mloop
  1171.     call80
  1172.  
  1173. nopFD    jmp    illegl            ;FD Illegal for    8080
  1174.  
  1175. cpi    cmp.b    (pseudopc)+,rega    ;FE CPI    nn
  1176.     setflag
  1177.  
  1178. rst7:                    ;FF RST    7
  1179.     rst80    $38
  1180.     page
  1181. *************************************************************************
  1182. *                                    *
  1183. *    Z-80 opcode simulation routines                    *
  1184. *                                    *
  1185. *************************************************************************
  1186.  
  1187. preED    moveq    #0,d1        ;Zero-fill high    bits.
  1188.     move.b    (pseudopc)+,d1    ;Grab next opcode.
  1189.     asl    #2,d1
  1190.     lea    EDoptab,a0
  1191.     move.l    0(a0,d1.w),-(sp)    ;Do the    operation.
  1192.     beq    illgED
  1193.     rts
  1194.  
  1195. illgED    move.l    (sp)+,d1    ;Trash the address.
  1196.     subq.l    #1,pseudopc    ;Fix PPC for ILLEGAL.
  1197.     jmp    illegl
  1198.  
  1199. ldir    move.l    d2,-(sp)
  1200.     move.w    regb(regs),d0    ;Grab count,
  1201.     subq.w    #1,d0        ; adjust for DBRA.
  1202.     moveq    #0,d1
  1203.     moveq    #0,d2
  1204.     move.w    regh(regs),d1    ;Source
  1205.     move.w    regd(regs),d1    ;Destination
  1206.     move.l    a5,-(sp)    ;We need an address register.
  1207.     lea    0(targbase,d2.l),a5
  1208.     lea    0(targbase,d1.l),a0
  1209. ldirlop    move.b    (a0)+,(a5)+
  1210.     addq.w    #1,d1
  1211.     addq.w    #1,d2
  1212.     dbra    d0,ldirlop
  1213.     move.l    (sp)+,a5    ;Restore a5.
  1214.     move.w    d1,regh(regs)    ;Update    8080 registers.
  1215.     move.w    d2,regd(regs)
  1216.     move.w    #0,regb(regs)
  1217.     moveq    #0,regf
  1218.     move.l    (sp)+,d2
  1219.     jmp    (return)
  1220.  
  1221. lddr    move.l    d2,-(sp)
  1222.     move.w    regb(regs),d0    ;Grab count,
  1223.     subq.w    #1,d0        ; adjust for DBRA.
  1224.     moveq    #0,d1
  1225.     moveq    #0,d2
  1226.     move.w    regh(regs),d1    ;Source
  1227.     move.w    regd(regs),d1    ;Destination
  1228.     move.l    a5,-(sp)    ;We need an address register.
  1229.     lea    1(targbase,d2.l),a5
  1230.     lea    1(targbase,d1.l),a0
  1231. lddrlop    move.b    -(a0),-(a5)
  1232.     subq.w    #1,d1
  1233.     subq.w    #1,d2
  1234.     dbra    d0,lddrlop
  1235.     move.l    (sp)+,a5    ;Restore a5.
  1236.     move.w    d1,regh(regs)    ;Update    8080 registers.
  1237.     move.w    d2,regd(regs)
  1238.     move.w    #0,regb(regs)
  1239.     moveq    #0,regf
  1240.     move.l    (sp)+,d2
  1241.     jmp    (return)
  1242.     page
  1243. cpir    move.w    regb(regs),d0    ;Grab count,
  1244.     subq.w    #1,d0        ; adjust for DBRA.
  1245.     moveq    #0,d1
  1246.     move.w    regh(regs),d1    ;Source
  1247.     lea    0(targbase,d1.l),a0
  1248. cpirlop    addq.w    #1,d1
  1249.     cmp.b    (a0)+,rega
  1250.     dbeq    d0,cpirlop
  1251.     seq    regf
  1252.     move.w    d1,regh(regs)    ;Restore 8080 registers.
  1253.     addq.w    #1,d0
  1254.     move.w    d0,regb(regs)
  1255.     tst.b    regf
  1256.     bne    cpir1
  1257.     moveq    #0,regf        ;Not found.
  1258.     jmp    (return)
  1259. cpir1    tst    d0
  1260.     bne    cpir2
  1261.     moveq    #$44,regf    ;Found,    in the string.
  1262.     jmp    (return)
  1263. cpir2    moveq    #$40,regf    ;Found,    but at last place.
  1264.     jmp    (return)
  1265.     page
  1266. *************************************************************************
  1267. *                                    *
  1268. *    Opcode dispatch table                        *
  1269. *                                    *
  1270. *************************************************************************
  1271.     data    data
  1272.  
  1273.     even
  1274. optabl    dc.l    nop00,lxib,staxb,inxb,inrb,dcrb,mvib,rlca
  1275.     dc.l    nop08,dadb,ldaxb,dcxb,inrc,dcrc,mvic,rrca
  1276.     dc.l    nop10,lxid,staxd,inxd,inrd,dcrd,mvid,ral
  1277.     dc.l    nop18,dadd,ldaxd,dcxd,inre,dcre,mvie,rar
  1278.     dc.l    nop20,lxih,shld,inxh,inrh,dcrh,mvih,daa
  1279.     dc.l    nop28,dadh,lhld,dcxh,inrl,dcrl,mvil,cma
  1280.     dc.l    nop30,lxis,sta,inxs,inrm,dcrm,mvim,stc
  1281.     dc.l    nop38,dads,lda,dcxs,inra,dcra,mvia,cmc
  1282.     dc.l    movebb,movebc,movebd,movebe,movebh,movebl,movebm,moveba
  1283.     dc.l    movecb,movecc,movecd,movece,movech,movecl,movecm,moveca
  1284.     dc.l    movedb,movedc,movedd,movede,movedh,movedl,movedm,moveda
  1285.     dc.l    moveeb,moveec,moveed,moveee,moveeh,moveel,moveem,moveea
  1286.     dc.l    movehb,movehc,movehd,movehe,movehh,movehl,movehm,moveha
  1287.     dc.l    movelb,movelc,moveld,movele,movelh,movell,movelm,movela
  1288.     dc.l    movemb,movemc,movemd,moveme,movemh,moveml,halt,movema
  1289.     dc.l    moveab,moveac,movead,moveae,moveah,moveal,moveam,moveaa
  1290.     dc.l    addb,addc,addd,adde,addh,addl,addm,adda
  1291.     dc.l    adcb,adcc,adcd,adce,adch,adcl,adcm,adca
  1292.     dc.l    subb,subc,subd,sube,subh,subl,subm,suba
  1293.     dc.l    sbbb,sbbc,sbbd,sbbe,sbbh,sbbl,sbbm,sbba
  1294.     dc.l    andb,andc,andd,ande,andh,andl,andm,anda
  1295.     dc.l    xrab,xrac,xrad,xrae,xrah,xral,xram,xraa
  1296.     dc.l    orab,orac,orad,orae,orah,oral,oram,oraa
  1297.     dc.l    cmpb,cmpc,cmpd,cmpe,cmph,cmpl,cmpam,cmpaa
  1298.     dc.l    rnz,popb,jnz,jmpa,cnz,pushb,adi,rst0
  1299.     dc.l    rz,ret,jz,nopCB,cz,call,aci,rst1
  1300.     dc.l    rnc,popd,jnc,out,cnc,pushd,sui,rst2
  1301.     dc.l    rc,nopD9,jc,in,cc,nopDD,sbi,rst3
  1302.     dc.l    rpo,poph,jpo,xthl,cpo,pushh,ani,rst4
  1303.     dc.l    rpe,pchl,jpe,xchg,cpe,preED,xri,rst5
  1304.     dc.l    rp,popp,jp,di,cp,pushp,oria,rst6
  1305.     dc.l    rm,sphl,jm,ei,cm,nopFD,cpi,rst7
  1306.     page
  1307. *************************************************************************
  1308. *                                    *
  1309. *    Flag register lookup tables                    *
  1310. *                                    *
  1311. *************************************************************************
  1312. flags    dc.b    $00,$01,$04,$05,$40,$41,$44,$45,$80,$81,$84,$85,$C0,$C1,$C4,$C5
  1313.     dc.b    $44,$00,$00,$04,$00,$04,$04,$00,$00,$04,$04,$00,$04,$00,$00,$04
  1314.     dc.b    $00,$04,$04,$00,$04,$00,$00,$04,$04,$00,$00,$04,$00,$04,$04,$00
  1315.     dc.b    $00,$04,$04,$00,$04,$00,$00,$04,$04,$00,$00,$04,$00,$04,$04,$00
  1316.     dc.b    $04,$00,$00,$04,$00,$04,$04,$00,$00,$04,$04,$00,$04,$00,$00,$04
  1317.     dc.b    $00,$04,$04,$00,$04,$00,$00,$04,$04,$00,$00,$04,$00,$04,$04,$00
  1318.     dc.b    $04,$00,$00,$04,$00,$04,$04,$00,$00,$04,$04,$00,$04,$00,$00,$04
  1319.     dc.b    $04,$00,$00,$04,$00,$04,$04,$00,$00,$04,$04,$00,$04,$00,$00,$04
  1320.     dc.b    $00,$04,$04,$00,$04,$00,$00,$04,$04,$00,$00,$04,$00,$04,$04,$00
  1321.     dc.b    $80,$84,$84,$80,$84,$80,$80,$84,$84,$80,$80,$84,$80,$84,$84,$80
  1322.     dc.b    $84,$80,$80,$84,$80,$84,$84,$80,$80,$84,$84,$80,$84,$80,$80,$84
  1323.     dc.b    $84,$80,$80,$84,$80,$84,$84,$80,$80,$84,$84,$80,$84,$80,$80,$84
  1324.     dc.b    $80,$84,$84,$80,$84,$80,$80,$84,$84,$80,$80,$84,$80,$84,$84,$80
  1325.     dc.b    $84,$80,$80,$84,$80,$84,$84,$80,$80,$84,$84,$80,$84,$80,$80,$84
  1326.     dc.b    $80,$84,$84,$80,$84,$80,$84,$80,$84,$80,$80,$84,$80,$84,$84,$80
  1327.     dc.b    $80,$84,$84,$80,$84,$80,$84,$80,$84,$80,$80,$84,$80,$84,$84,$80
  1328.     dc.b    $84,$80,$80,$84,$80,$84,$84,$80,$80,$84,$84,$80,$84,$80,$80,$84
  1329.     page
  1330. *************************************************************************
  1331. *                                    *
  1332. *    Z80 opcode dispatch table.  One longword entry per opcode    *
  1333. *    of the target (Z-80) processor, including illegals.        *
  1334. *                                    *
  1335. *************************************************************************
  1336. *                                    *
  1337. *    Only a few of the most popular instructions are    simulated.    *
  1338. *    Support    for the    Z-80 Block Move    instructions is    provided    *
  1339. *    as the flags for this simulation resemble those    of the Z-80    *
  1340. *    rather than the    8080.  Certain packages    (notably BDS C)    check    *
  1341. *    the flags and mistakenly assume    a Z-80,    then use LDIR/LDDR.    *
  1342. *    Therefore, minimal Z-80    support    is provided for    these        *
  1343. *    instructions.  By no means is this a complete simulation    *
  1344. *    of the Z-80.                            *
  1345. *                                    *
  1346. *************************************************************************
  1347.  
  1348. EDoptab:
  1349.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED00
  1350.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED10
  1351.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED20
  1352.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED30
  1353.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED40
  1354.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED50
  1355.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED60
  1356.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED70
  1357.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED80
  1358.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;ED90
  1359.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;EDA0
  1360.     dc.l    ldir,cpir,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;EDB0
  1361.     dc.l    lddr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;EDC0
  1362.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;EDD0
  1363.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;EDE0
  1364.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;EDF0
  1365.  
  1366.  
  1367. traceit    dc.b    trace        ;Trace option is available - used by SIMCPM1.
  1368.  
  1369.  
  1370.     bss    bss
  1371.  
  1372.     even
  1373.  
  1374. tracesad ds.l    1        ;Start address for trace
  1375. traceead ds.l    1        ;End address for trace
  1376. traceflg ds.b    1        ;Trace activity    flag
  1377.  
  1378.     end
  1379.